1 JSBinding概述
说明:
JSBinding是JS和native之间的一个桥梁,通过这个桥梁,JS可以调用Native,Native可以调用JS。
注意:
JSBinding不是什么
- not Hybrid
- not a new technology
历史:
cocos2D-X使用zynga提出的一个方案(https://github.com/zynga/jsbindings),`JS Engine使用的是SpiderMonkey`。1.1 JS和Native
说明:两者结合初衷如下
| 原生静态语言 | 动态脚本语言 |
|---|---|
| 高性能 | 简单易用 |
| 更底层,更强大 | 免编译 |
| 平台特性 | 热部署 |
1.2 iOS 7 and JavaScriptCore
说明:在
iOS 7之后,苹果公布了JavaScriptCore的API,在这之前一直是iOS系统私有的。
扩展:Mac的JavaScriptCore一直是开放的。
要点:包括以下部分
JavaScriptCore.h头文件JSContext类:JS的运行环境JSValue类:JSExport类
1.2.1 Eval JavaScript Code
说明:利用引擎执行
JS代码
1 |
|
1.2.2 Call JavaScript Function
说明:假设一个叫做
sum的JS方法已经被加载
1 | // a "sum" function was loaded in context |
1.2.3 Create JavaScript Value
说明:可以先创建
JS的值,再赋值给相应变量。
1 | // 在指定上下文中创建值 231 |
another way
1 | [context evaluateScript: @"var bar = 231;bar++;"]; |
1.2.4 Type Conversion
说明:
JS和O-C之间对应类型的转换
| Objective-C type | JavaScript type |
|---|---|
| nil | undefined |
| NSNull | null |
| NSString | string |
| NSNumber | number, boolean |
| NSDictionary | Object object |
| NSArray | Array object |
| NSDate | Date object |
| NSBlock | Function object |
| id | Wrapper object |
| Class | Constructor object |
1.3 完整实例
1 |
|
2 初始iOS7 JavaScriptCore API
2.1 Call Native Code via Block
说明:
JS调用Native
1 | //------------ JS 调用 Native |
2.2 Call Native Code via JSExport
说明:通过
jsExport调用Native
- Create a js export Class in Objective-C(创建
jsExport类)- the instance of this class can be accessed in js context(该类的实例可以在
js的上下文中访问到)- No Constructor in JS(无法在
JS中访问到JSExport对象的构造函数)
###实例
说明:需要做以下工作
- 定义一个
JSExport的子协议:协议指定的成员才能够暴露给JS上下文- 创建一个
O-C类,并采纳协议
Point3D.h
1 |
|
Point3D.m
1 |
|
main.m
1 | NSString *script; |
2.3 载入js文件来执行
说明:加入
js文件比起在Native代码中创建js脚本子串要通用、易用的多。
1 | // 创建文件路径 |
3 JavaScriptCore API 进阶
3.1 Memory Leak
说明:
js中对象的循环引用和o-c中对象的循环引用都不会导致内存泄漏。但js对象和Native对象之间的循环引用会导致内存泄漏。
js对象之间循环引用:不会内存泄漏o-c对象和js对象之间循环引用:会内存泄漏解决:
o-c对象引用js对象时将后者包装为JSManageredValue
JS Code
1 | var girl = new Girl(); |
Objective-C Code
1 | @implementation Boy |
3.2 Threding and parallelism
说明:要点
- API is thread safe(API是线程安全的)
- Locking granularity is JSVirtualMachine(锁的最小粒度为是
JS虚拟机)- Use separate JSVirtualMachines for parallelism(并发时要使用不同的
JS虚拟机)
###实例
说明:创建了2个虚拟机实例- jsvmA:运行了两个
js上下文(ctxA1和ctxA2)- jsvmB:运行了一个
js上下文(ctxB)
ctxA1和ctxA2能够在并发情形下正常通信,但他们ctxB在并发环境下不能通信。因为前两者在同一个虚拟机中运行,也就意味着运行在同一个线程中。
1 | // 创建 js 虚拟机实例 jsvmA |
3.3 JSBinding in the Real World
说明:
JSBinding的一些实际应用。说明:2种
JS引擎比较,JavaScriptCore和SpiderMonkey
- JavaScriptCore
- SpiderMonkey(Cocos2D-iPhone-2.1-bate3)
- SpiderMonkey(Cocos2D-x-2.1-bate3)
- SpiderMonkey(iMonkey)
注意:
v8引擎不受支持,因为其依赖于JIT,被苹果禁用。3.3.2 JSBind VS LuaBinding
说明:
JSBinding和LuaBinding比较
LUA为什么在游戏编程领域被广泛运用
https://www.zhihu.com/question/21717567Cocos2dx+LUA合适还是Cocos2dx+JS合适
https://www.zhihu.com/question/211303853.3.3 Which to Choose
- Native
- Web
- Hybrid
- ScriptBinding







